package es.tikitaka.dao.impl;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;

import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;

import es.tikitaka.dao.DireccionService;
import es.tikitaka.dictionary.MunicipioDic;
import es.tikitaka.dictionary.ProvinciaDic;
import es.tikitaka.domain.Direccion;

/**
 * 
 * @author Saúl Domínguez
 * @since 2010
 * @category PFC
 */

@Name("direccionService")
public class DireccionServiceImpl implements DireccionService {

	@In
	EntityManager em;

	/**
	 * Constructor por defecto
	 */
	public DireccionServiceImpl() {
		// TODO Auto-generated constructor stub
	}

	/**
	 * Método para listar todas las direciones almacenadas en el sistema
	 * 
	 * @return lista de direcciones
	 */
	@SuppressWarnings("unchecked")
	public List<Direccion> getList() {
		List<Direccion> list = null;
		try {
			list = em
					.createQuery(
							"select d from Direccion d order by d.direccion, d.provincia.provincia")
					.getResultList();
		} catch (RuntimeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return list;
	}

	/**
	 * Método para comprobar si existe una dirección o no
	 * 
	 * @param direccion
	 *            lugar de residencia
	 * @param provincia
	 *            Provincia
	 * @param municipio
	 *            Municipio
	 * @return dirección en el caso de que exista
	 */
	public Direccion buscar(String direccion, ProvinciaDic provincia,
			MunicipioDic municipio) {

		Direccion direc = null;

		try {
			direc = (Direccion) em
					.createQuery(
							"select d from Direccion d left join fetch d.provincia p left join fetch d.municipio m where d.direccion = ?1 and p.id = ?2 and m.id = ?3")
					.setParameter("1", direccion).setParameter("2",
							provincia.getId()).setParameter("3",
							municipio.getId()).getSingleResult();
		} catch (NoResultException n) {
			n.printStackTrace();
		}

		return direc;
	}

	/**
	 * Método para eliminar una dirección del sistema
	 * 
	 * @param id
	 *            Id de la dirección a eliminar
	 * @return estado de la operción (true or false)
	 */
	public boolean delete(Integer id) {
		boolean correcto;
		try {
			Direccion direccion = em.getReference(Direccion.class, id);
			em.remove(direccion);
			em.flush();
			correcto = true;
		} catch (RuntimeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			correcto = false;
		}
		return correcto;
	}

	/**
	 * Método para guardar una dirección en el sistema o las modificaciones de
	 * una dirección ya existente
	 * 
	 * @param direccion
	 *            Direccion a guardar en el sistema
	 * @return estado de la operación (true or false)
	 */
	public boolean save(Direccion direccion) {
		boolean correcto;
		try {
			em.persist(direccion);
			em.flush();
			correcto = true;
		} catch (RuntimeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			correcto = false;
		}
		return correcto;
	}
}
